<?php
/**
 * Vbot 微信机器人服务
 * @App	
 * @Group 
 * @Action VbotService
 * @author lilei
 * @date 2018年11月15日
 *
 */
namespace app\common\service;
use app\common\library\CommonFun;
use app\common\service\vbot\VbotMessageHandler;
use app\common\service\vbot\VbotObserver;
use Hanson\Vbot\Foundation\Vbot;

class VbotService {
	/**
	 * Vbot配置项目
	 * @var array
	 */
	private $config;
	
	/**
	 * 构造方法
	 */
	public function __construct( $session = null ) {
		// 获取配置文件
		CommonFun::get_other_config("VbotConfig",2);
		$this->config = config('vbotConfig');
		// 设置session
		if ( $session ) {
			$this->config['session'] = $session;
		}
	}
	
	/**
	 * 启动机器人
	 */
	public function run() {
		// 机器人对象
		$robot = new Vbot($this->config);
		
		// 获取消息处理器实例
		$messageHandler = $robot->messageHandler;
		
		/**
		 * 设置消息处理器
		 * 收到消息时触发
		 */
		$messageHandler->setHandler([ VbotMessageHandler::class, 'messageHandler' ]);
		
		// 获取监听器
		$observer = $robot->observer;
		
		$observer->setQrCodeObserver([VbotObserver::class, 'setQrCodeObserver']);
		$observer->setLoginSuccessObserver([VbotObserver::class, 'setLoginSuccessObserver']);
		$observer->setReLoginSuccessObserver([VbotObserver::class, 'setReLoginSuccessObserver']);
		$observer->setExitObserver([VbotObserver::class, 'setExitObserver']);
		$observer->setFetchContactObserver([VbotObserver::class, 'setFetchContactObserver']);
		$observer->setBeforeMessageObserver([VbotObserver::class, 'setBeforeMessageObserver']);
		$observer->setNeedActivateObserver([VbotObserver::class, 'setNeedActivateObserver']);
		
		// 启动
		$robot->server->serve();
	}
	
	/**
	 * 通过shell启动微信网页机器人
	 * nohup /usr/local/php/bin/php /data/wwwroot/ihold_spider/Crontab/index.php /Vbot/run release 127.0.0.1 1 >> /tmp/vbot.log 2> /dev/null &
	 */
	public function run_command( $user_mark ) {
		$is_running = $this->is_running($user_mark);
		if ( $is_running ) {
			CommonFun::make_exception("微信网页机器人已经运行");
			return false;
		}
		// 后台PHP执行路径入口
		$php = "/usr/local/php/bin/php ".WEB_ROOT_PATH."Crontab/index.php";
		// 程序文件
		$app = "/Vbot/run/user/{$user_mark}";
		// 日志路径
		$log = "/tmp/vbot.log";
		// 环境标识
		$env = ENV;
		// 命令
		$command = "nohup {$php} {$app} $env 127.0.0.1 1 >> {$log} 2> /dev/null &";
		// 执行命令
		$status = 0;
		$a = @exec($command, $out, $status);
		if ( $status>0 ) {
			CommonFun::make_exception("启动微信网页机器人命令执行失败");
			return false;
		}else {
			return true;
		}
	}
	
	/**
	 * 通过shell杀掉微信网页机器人进程
	 * kill -9 $(ps -ef|grep Vbot\/run|grep -v grep|awk '{print $2}')
	 * @param string $user_mark
	 */
	public function kill_command( $user_mark ) {
		$is_running = $this->is_running($user_mark);
		if ( !$is_running ) {
			CommonFun::make_exception("微信网页机器人没有运行");
			return false;
		}
		// 程序文件
		$app = "/Vbot/run/user/{$user_mark}";
		// 命令
		$command = "kill -9 $(ps -ef|grep {$app}|grep -v grep|awk '{print $2}')";
		// 执行命令
		$status = 0;
		$a = @exec($command, $out, $status);
		if ( $status>0 ) {
			CommonFun::make_exception("执行失败");
			return false;
		}else {
			return true;
		}
	}
	
	/**
	 * 判断进程是否在执行
	 * @param string $user_mark
	 * ps -ef|grep Vbot/run/user/lileino23|grep -v grep|wc -l
	 * @return boolean
	 */
	public function is_running( $user_mark ) {
		// 程序文件
		$app = "/Vbot/run/user/{$user_mark}";
		// 命令
		$command = "ps -ef|grep {$app}|grep -v grep|wc -l";
		// 执行命令
		$status = 0;
		$a = @exec($command, $out, $status);
		if ( $out[0]>0 ) {
			return true;
		}else {
			return false;
		}
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}